4.4.1 Superfici Bicubiche (Patches)
Fig. 10-Primo esempio
Ora vediamo che ci è sfuggito qualcosa.
Sembra che ci siano degli angoli netti, quasi delle sfaccettature, soprattutto
vicino alla cima. E' certamente un qualche tipo di sfaccettatura, dovuto
ai parametri U_STEPS
e V_STEPS.
Cambiamoli da 3 a 4 e vediamo cosa accade.
Molto meglio, ma il rendering ci ha messo un po' di più. Questo
è un compromesso inevitabile. Se vogliamo un dettaglio ancora più
fine, dobbiamo usare valori per U_STEPS
e V_STEPS
di 5 e impostare flatness
a zero. Ma dobbiamo aspettarci di usare molta più memoria ed un
tempo di rendering ancora più lungo.
Bene, non possiamo lasciare questa scena senza aggiungere qualche oggetto
per interesse. Dichiariamo l'oggetto patch e spargiamone un po' in giro :
#declare TeePee = bicubic_patch {
type 1 flatness 0.0100 u_steps 3 v_steps 3,
<-5.174134, 5.528420, -13.211995>,
<-1.769023, 5.528420, 0.000000>,
<1.636088, 5.528420, 0.000000>,
<5.041199, 5.528420, -13.003932>,
<-5.174134, 1.862827, 0.000000>,
<0.038471, 0.031270, 18.101474>,
<0.036657, 0.031270, 18.101474>,
<5.041199, 1.862827, 0.000000>,
<-5.174134, -1.802766, 0.000000>,
<0.038471, 0.028792, 18.101474>,
<0.036657, 0.028792, 18.101474>,
<5.041199, -1.802766, 0.000000>,
<-5.174134, -5.468359, -13.070366>,
<-1.769023, -5.468359, 0.000000>,
<1.636088, -5.468359, 0.000000>,
<4.974128, -5.468359, -12.801446>
texture {
TeePeeTex
}
rotate -90*x // per orientare correttamente l'oggetto
rotate 25*y // per vedere meglio le quattro 'zampe'
}
object { TeePee }
object { TeePee translate <8, 0, 8> }
object { TeePee translate <-9, 0, 9> }
object { TeePee translate <18, 0, 24> }
object { TeePee translate <-18, 0, 24> }
Fig. 11-Aumentano gli oggetti
Sembra buono. Facciamo qualcosa per quel
noioso sfondo grigio. Eliminiamo la dichiarazione del background
e sostituiamola con :
plane { y, 500
texture { pigment { SkyBlue }
finish { ambient 1 diffuse 0} }
texture { pigment {
bozo turbulence .5
color_map { White]
White filter 1] } }
finish { ambient 1 diffuse 0 }
scale <1000, 250, 250> rotate <5,
45, 0> } }
Questo aggiunge un piacevole cielo riempito di nuvole.
Fig. 12-Aggiungere un cielo
Ora, sostituiamo il piano a scacchi con
dune sabbiose ondulate :
plane {y,-12
texture {
pigment {
color <.85, .5, .15>
}
finish {
ambient .25
diffuse .6
crand .5
}
normal {
ripples .35
turbulence .25
frequency 5
}
scale 10
translate 50*x
}
}
Renderizziamo a 320x240 senza antialiasing.
Fig. 13-Aggiungere della sabbia
Non male ! Aggiungiamo solo un altro
elemento. Mettiamo un 'uovo' dorato sotto ogni tepee. Dato che questo è
un tutorial sulle patch, facciamo le uova usando le patch.
Torniamo a Moray e creiamo un'altra patch. Diamole il nome Egg1 e selezioniamo
"CYLINDRICAL 2 - PATCH" dalla finestra di dialogo "CREATE
BEZIER PATCH". Facciamo clic su "EXTENDED EDIT". Ora "MARK
ALL" e ruotiamo la patch in modo che il cilindro giaccia su un lato.
"UNMARK ALL". Nella vista "FRONT" selezioniamo i quattro
punti all'estremità destra. Nella vista "SIDE", facciamo
clic col tasto destro del mouse e "MAXIMIZE". Zoomiamo un po'
più vicino. Col comando "UFRM SCL" avviciniamo i 4 punti
il più possibile. Zoomiamo ancora in avanti e ripetiamo. Zoomiamo
indietro, clic destro, "MINIMIZE". Selezioniamo "TRANSLATE"
e trasciniamo i punti a sinistra in modo che siano allineati sull'asse
Z col vicino gruppo di 4 punti. Questo dovrebbe creare un'estremità
chiusa. Ripetiamo questo procedimento per l'altra estremità. "UNMARK
ALL". Nella vista "FRONT" la griglia di controllo dovrebbe
essere un rettangolo e la patch un ellissoide. Tenendo premuto [SHIFT]
tracciamo un rettangolo attorno all'angolo superiore destro della griglia
di controllo per selezionare quei punti. Tracciamo un rettangolo attorno
all'estremità inferiore destra per selezionare anche quelli. Nella
vista "SIDE", si effettua un "UFRM SCL" su quei punti
per rendere un po' più larga quell'estremità dell'uovo. Infine,
"UNMARK ALL". L'uovo potrebbe avere bisogno di qualche aggiustatura.
Si dovrebbe riuscire a "MARK ALL" e "LOCAL SCL" le
tre viste per ottenere qualcosa che sembri un uovo. Avendo imparato dal
tepee, proseguiamo e cambiamo i valori di U_STEPS e V_STEPS a 4.
Creiamo un'altra texture fasulla, le diamo il nome EggTex e la assegnamo
all'uovo. Dal menu file, scegliamo "SAVE SEL" dando il nome egg1.mdl.
Carichiamo questo file ed esportiamo [CTRL F9]. Usciamo da Moray e copiamo
i file egg1.pov ed egg1.inc nella nostra directory.
Di ritorno al file bezdemo.pov creiamo una bella texture dorata
e brillante.
#declare EggTex = texture {
pigment { BrightGold }
finish {
ambient .1
diffuse .4
specular 1
roughness 0.001
reflection .5
metallic
}
}
già che ci siamo, miglioriamo
la nostra texture TeePeeTex :
#declare TeePeeTex = texture {
pigment { Silver }
finish {
ambient .1
diffuse .4
specular 1
roughness 0.001
reflection .5
metallic
}
}
Ora incolliamo i nostri dati della
patch relativa all'uovo e dichiariamo l'uovo :
#declare Egg = union { // Egg1
bicubic_patch {
type 1 flatness 0.0100 u_steps 4 v_steps 4,
<2.023314, 0.000000, 4.355987>,
<2.023314, -0.000726, 4.355987>,
<2.023312, -0.000726, 4.356867>,
<2.023312, 0.000000, 4.356867>,
<2.032037, 0.000000, 2.734598>,
<2.032037, -1.758562, 2.734598>,
<2.027431, -1.758562, 6.141971>,
<2.027431, 0.000000, 6.141971>,
<-1.045672, 0.000000, 3.281572>,
<-1.045672, -1.758562, 3.281572>,
<-1.050279, -1.758562, 5.414183>,
<-1.050279, 0.000000, 5.414183>,
<-1.044333, 0.000000, 4.341816>,
<-1.044333, -0.002947, 4.341816>,
<-1.044341, -0.002947, 4.345389>,
<-1.044341, 0.000000, 4.345389>
}
bicubic_patch {
type 1 flatness 0.0100 u_steps 4 v_steps 4,
<2.023312, 0.000000, 4.356867>,
<2.023312, 0.000726, 4.356867>,
<2.023314, 0.000726, 4.355987>,
<2.023314, 0.000000, 4.355987>,
<2.027431, 0.000000, 6.141971>,
<2.027431, 1.758562, 6.141971>,
<2.032037, 1.758562, 2.734598>,
<2.032037, 0.000000, 2.734598>,
<-1.050279, 0.000000, 5.414183>,
<-1.050279, 1.758562, 5.414183>,
<-1.045672, 1.758562, 3.281572>,
<-1.045672, 0.000000, 3.281572>,
<-1.044341, 0.000000, 4.345389>,
<-1.044341, 0.002947, 4.345389>,
<-1.044333, 0.002947, 4.341816>,
<-1.044333, 0.000000, 4.341816>
}
texture { EggTex }
translate <0.5, 0, -5> // centra l'uovo sull'origine
translate -9.8*y // mette l'uovo sul suolo
}
Ora mettiamo una copia dell'uovo sotto
ogni tepee. Questo dovrebbe richiederci di cambiare solo le coordinate
x e z di ogni uovo :
object { Egg }
object { Egg translate <8, 0, 8> }
object { Egg translate <-9, 0, 9> }
object { Egg translate <18, 0, 24> }
object { Egg translate <-18, 0, 24> }
Renderizziamo la scena a 320x240 -a.
Tutto va bene e possiamo renderizzarla a 640x480 +a.
Fig. 14- Risultato finale
Possiamo vedere che c'è ancora qualche sfaccettatura vicino alla cima dei tepee e sulle uova. L'unica soluzione è di aumentare da 4 a 5 U_STEPS e V_STEPS e regolare flatness a zero per tutti i nostri oggetti. Facciamo i cambiamenti e renderizziamo a 640x480 +a.